import pandas as pd  # 导入pandas库
import folium  # 导入folium库
import numpy as np  # 导入numpy库
import geopandas as gpd  # 导入geopandas库
from shapely.geometry import Polygon  # 从shapely.geometry导入Polygon类

# 读取Excel文件中的数据
df = pd.read_excel("data\\路侧停车位基础信息.xlsx")  # 从Excel文件中读取前500行数据

# 提取经纬度和泊位数量信息
coordinates = df[['经度', '纬度']].values  # 提取经纬度信息
capacities = df['泊位数量'].values  # 提取泊位数量信息

# 定义网格大小（例如0.01度）
grid_size = 0.01  # 定义网格大小为0.01度

# 计算每个停车场所在的网格
df['grid_x'] = (df['经度'] // grid_size).astype(int)  # 计算每个停车场所在的网格x坐标
df['grid_y'] = (df['纬度'] // grid_size).astype(int)  # 计算每个停车场所在的网格y坐标

# 统计每个网格内的停车场数量和总泊位数量
grid_stats = df.groupby(['grid_x', 'grid_y']).agg(  # 按网格x和y坐标分组，统计每个网格内的总泊位数量
    total_capacity=('泊位数量', 'sum')  # 计算总泊位数量
).reset_index()  # 重置索引

# 创建一个以北京市为中心的地图
beijing_map = folium.Map(location=[39.9042, 116.4074], zoom_start=12)  # 创建以北京市为中心的地图，初始缩放级别为12

# 加载北京边界的GeoJSON文件
geojson_path = "E:\\大二上\\Weiguan\\110000.geojson"  # 定义北京边界的GeoJSON文件路径
folium.GeoJson(geojson_path, name="Beijing Boundaries").add_to(beijing_map)  # 将北京边界添加到地图中

# 创建GeoDataFrame
polygons = []  # 初始化多边形列表
for idx, row in grid_stats.iterrows():  # 遍历每个网格统计数据
    x_min = row['grid_x'] * grid_size  # 计算网格的最小x坐标
    x_max = (row['grid_x'] + 1) * grid_size  # 计算网格的最大x坐标
    y_min = row['grid_y'] * grid_size  # 计算网格的最小y坐标
    y_max = (row['grid_y'] + 1) * grid_size  # 计算网格的最大y坐标
    polygons.append(Polygon([(x_min, y_min), (x_min, y_max), (x_max, y_max), (x_max, y_min)]))  # 创建多边形并添加到列表中

gdf = gpd.GeoDataFrame(grid_stats, geometry=polygons)  # 创建GeoDataFrame，包含网格统计数据和几何信息

# 设置CRS为WGS84 (EPSG:4326)
gdf.set_crs(epsg=4326, inplace=True)  # 设置坐标参考系统为WGS84

# 添加Choropleth图层
folium.Choropleth(  # 添加Choropleth图层
    geo_data=gdf,  # 使用GeoDataFrame作为地理数据
    name='choropleth',  # 图层名称
    data=gdf,  # 使用GeoDataFrame作为数据源
    columns=['grid_x', 'total_capacity'],  # 指定数据列
    key_on='feature.properties.grid_x',  # 指定用于匹配的键
    fill_color='YlOrRd',  # 填充颜色
    fill_opacity=0.7,  # 填充不透明度
    line_opacity=0.2,  # 线条不透明度
    legend_name='Total Parking Capacity'  # 图例名称
).add_to(beijing_map)  # 将Choropleth图层添加到地图中

# 保存地图到HTML文件
beijing_map.save("beijing_parking_supply_map.html")  # 将地图保存为HTML文件